#pragma once

#include <memory>
#include <boost/asio.hpp>
#include <boost/beast.hpp>
#include "../core/message_receiver.hpp"
#include <unordered_map>
#include <mutex>
#include <nlohmann/json.hpp>
#include "websocket_session.hpp"

/**
 * @brief WebSocket服务器类
 * 
 * 负责处理WebSocket连接的建立和管理
 * 使用Boost.Beast库实现WebSocket协议
 */
class WebSocketServer {
public:
    /**
     * @brief 构造函数
     * @param io_context Boost.Asio的IO上下文，用于异步操作
     * @param address 服务器监听的IP地址
     * @param port 服务器监听的端口号
     * @param receiver 消息接收器，用于处理接收到的消息
     */
    WebSocketServer(boost::asio::io_context& io_context, 
                   const std::string& address, 
                   unsigned short port,
                   IMessageReceiver& receiver);

    /**
     * @brief 启动服务器
     * 开始监听新的连接请求
     */
    void start();

    /**
     * @brief 停止服务器
     * 关闭所有连接并停止监听
     */
    void stop();

    /**
     * @brief 发送消息
     * @param session_id 会话ID
     * @param message 消息
     */
    void send_message(uint32_t session_id, const nlohmann::json& message);

private:
    /**
     * @brief 开始接受新的连接
     * 异步等待新的TCP连接请求
     */
    void do_accept();

    /**
     * @brief 处理新连接的回调函数
     * @param ec 错误码
     * @param socket 新建立的TCP套接字
     */
    void on_accept(boost::beast::error_code ec, boost::asio::ip::tcp::socket socket);

    /**
     * @brief 获取会话
     * @param session_id 会话ID
     * @return 会话
     */
    std::shared_ptr<WebSocketSession> get_session(uint32_t session_id);

    boost::asio::io_context& io_context_;        ///< IO上下文引用
    boost::asio::ip::tcp::acceptor acceptor_;    ///< TCP接受器，用于接受新连接
    IMessageReceiver& receiver_;                 ///< 消息接收器引用
    std::unordered_map<uint32_t, std::shared_ptr<WebSocketSession>> sessions_; ///< 会话映射表
    std::mutex mutex_;                          ///< 互斥锁，用于保护会话映射表
    uint32_t session_id_counter_ = 1;               ///< 会话ID计数器
}; 